package com.zerui.manager.deviceTouch;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zerui.devicemanager.provider.dto.DeviceDTO;
import com.zerui.manager.web.enums.DeviceFromEnum;
import com.zerui.manager.web.vo.icc.ChannelVO;
import com.zerui.manager.web.vo.icc.DeviceInfoVO;
import com.zerui.manager.web.vo.icc.UnitVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 设备模型
 *
 * @author pyzhang
 * @since 2024-04-11
 */
@ApiModel("远程设备落地（ICC平台和IoT平台设备）落地备份")
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceTouch {

    /**
     * 主键
     */
    @ApiModelProperty("主键，无业务含义")
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;
    /**
     * 设备源自 1：IoT 2：ICC
     */
    @ApiModelProperty("设备源自 1：IoT 2：ICC ")
    private Integer deviceFrom;
    /**
     * 源记录-设备ID
     */
    @ApiModelProperty("源记录-设备ID")
    private String deviceId;
    /**
     * 源记录-设备编号
     */
    @ApiModelProperty("源记录-设备编号")
    private String deviceCode;
    /**
     * 源记录-设备序列号
     */
    @ApiModelProperty("源记录-设备序列号")
    private String deviceSn;
    /**
     * 源记录-设备名称
     */
    @ApiModelProperty("源记录-设备名称")
    private String deviceName;
    /**
     * 源记录-设备厂商
     */
    @ApiModelProperty("源记录-设备厂商")
    private String deviceManufacturer;
    /**
     * 源记录-设备型号
     */
    @ApiModelProperty("源记录-设备型号")
    private String deviceModel;
    /**
     * 源记录-设备大类  8：门禁
     */
    @ApiModelProperty("源记录-设备大类  8：门禁")
    private String deviceCategory;
    /**
     * 源记录-设备IP地址
     */
    @ApiModelProperty("源记录-设备IP地址")
    private String deviceIp;
    /**
     * 设备账号及通道信息 JSON
     */
    @ApiModelProperty("设备账号及通道信息 JSON")
    private String deviceAccountChannel;
    /**
     * 源记录-分类编号
     */
    @ApiModelProperty("源记录-分类编号")
    private String typeCode;
    /**
     * 源记录-分类名称
     */
    @ApiModelProperty("源记录-分类名称")
    private String typeName;
    /**
     * 源记录-产品代码
     */
    @ApiModelProperty("源记录-产品代码")
    private String productCode;
    /**
     * 源记录-产品名称
     */
    @ApiModelProperty("源记录-产品名称")
    private String productName;
    /**
     * 源记录-节点类型
     */
    @ApiModelProperty("源记录-节点类型")
    private String nodeType;
    /**
     * 源记录-节点类型名称
     */
    @ApiModelProperty("源记录-节点类型名称")
    private String nodeTypeName;
    /**
     * 源记录-所属分组ID
     */
    @ApiModelProperty("源记录-所属分组ID")
    private String groupId;
    /**
     * 源记录-所属分组名称
     */
    @ApiModelProperty("源记录-所属分组名称")
    private String groupName;
    /**
     * 源记录-所属部门ID
     */
    @ApiModelProperty("源记录-所属部门ID")
    private String orgId;
    /**
     * 源记录-所属部门名称
     */
    @ApiModelProperty("源记录-所属部门名称")
    private String orgName;
    /**
     * 源记录-建筑编号
     */
    @ApiModelProperty("源记录-建筑编号")
    private String buildNo;
    /**
     * 源记录-建筑名称
     */
    @ApiModelProperty("源记录-建筑名称")
    private String buildName;
    /**
     * 源记录-楼层编码
     */
    @ApiModelProperty("源记录-楼层编码")
    private String levelNo;
    /**
     * 源记录-楼层名称
     */
    @ApiModelProperty("源记录-楼层名称")
    private String levelName;
    /**
     * 源记录-楼层编码
     */
    @ApiModelProperty("源记录-房间号")
    private String roomNo;
    /**
     * 源记录-楼层名称
     */
    @ApiModelProperty("源记录-房间名称")
    private String roomName;
    /**
     * 源记录-所在位置
     */
    @ApiModelProperty("源记录-所在位置")
    private String position;
    /**
     * 是否在线 0：离线 1：在线
     */
    @ApiModelProperty("是否在线 0：离线 1：在线")
    private Integer isOnline;
    /**
     * 上级设备
     */
    @ApiModelProperty("上级设备")
    private String parentDeviceId;
    /**
     * 上级设备名称
     */
    @ApiModelProperty("上级设备名称")
    private String parentDeviceName;
    /**
     * 删除标识 0：未删除 1：已删除
     */
    @ApiModelProperty(" 删除标识 0：未删除 1：已删除")
    private String delFlag;
    /**
     * 同步次数ID
     */
    @ApiModelProperty(" 同步次数ID")
    private Long touchSyncId;
    /**
     * 同步操作 add、update、delete
     */
    @ApiModelProperty(" 同步操作 add、update、delete")
    private String touchSyncHandle;
    /**
     * 创建时间
     */
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;
    /**
     * 创建人
     */
    @ApiModelProperty("创建人")
    private String createBy;
    /**
     * 更新时间
     */
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;
    /**
     * 更新人
     */
    @ApiModelProperty("更新人")
    private String updateBy;

    public static DeviceTouch ofIoTDevice(DeviceDTO deviceDTO) {
        DeviceTouch deviceTouch = DeviceTouch.builder()
                .deviceFrom(DeviceFromEnum.FROM_IOT.getCode())
                .deviceId(deviceDTO.getDeviceId() + "")
                .deviceCode(deviceDTO.getCode())
                .deviceName(deviceDTO.getName())
                .deviceIp(deviceDTO.getAddress()) // IP地址
                .deviceCategory("IOT") // 来自物联网设备
                .typeCode(deviceDTO.getType()) // device-manager固定值
                .typeName(deviceDTO.getType()) // device-manager固定值
                .productCode(deviceDTO.getTypeCode())
                .productName(deviceDTO.getTypeName())
                .nodeType(deviceDTO.getNodeType() + "")
                .nodeTypeName(deviceDTO.getNodeTypeName())
                .buildNo(null != deviceDTO.getBuildingId() ? String.valueOf(deviceDTO.getBuildingId()) : null)
                .levelNo(null != deviceDTO.getLevelId() ? String.valueOf(deviceDTO.getLevelId()) : null)
                .roomNo(null != deviceDTO.getRoomId() ? String.valueOf(deviceDTO.getRoomId()) : null)
                .position(deviceDTO.getPosition())
                .isOnline(deviceDTO.getStatus()) // 1:在线
                .parentDeviceId(deviceDTO.getParentDeviceId() + "")
                .parentDeviceName(deviceDTO.getParentDeviceName())
                .delFlag("0") // 未删除的
                .build();
        return deviceTouch;
    }


    public static DeviceTouch ofIccDevice(DeviceInfoVO deviceInfoVO) {
        List<ChannelVO> channelVOList = new ArrayList<>();
        for (UnitVO unitVO : deviceInfoVO.getUnits()) {
            if (null != unitVO.getChannels() && unitVO.getChannels().size() > 0)
                channelVOList.addAll(unitVO.getChannels());
        }
        DeviceTouch deviceTouch = DeviceTouch.builder()
                .deviceFrom(DeviceFromEnum.FROM_ICC.getCode())
                .deviceId(deviceInfoVO.getDeviceCode())
                .deviceCode(deviceInfoVO.getDeviceCode())
                .deviceName(deviceInfoVO.getDeviceName())
                .deviceSn(deviceInfoVO.getDeviceSn())
                .deviceIp(deviceInfoVO.getDeviceIp())
                .deviceManufacturer(deviceInfoVO.getDeviceManufacturer())
                .deviceModel(deviceInfoVO.getDeviceModel())
                .deviceCategory(deviceInfoVO.getDeviceCategory() + "") // 其他的均来自 ICC
                .typeCode("ICC-DR-" + deviceInfoVO.getDeviceCategory()) // device-manager固定值
                .typeName("ICC-DR-" + deviceInfoVO.getDeviceCategory()) // device-manager固定值
                .productCode("ICC-DR-" + deviceInfoVO.getDeviceCategory() + "-" + deviceInfoVO.getDeviceType()) // 产品
                .deviceAccountChannel(JSONObject.toJSONString(channelVOList)) // 通道
                .nodeType("1")
                .nodeTypeName("设备") // 设置固定值
                .isOnline(deviceInfoVO.getIsOnline()) // 1:在线
                .delFlag("0") // 未删除的
                .build();
        return deviceTouch;
    }
}